#include <iostream>
#define n 8

/**
A knight's tour is a sequence of moves of a knight on a chessboard
such that the knight visits every square only once. If the knight
ends on a square that is one knight's move from the beginning
square (so that it could tour the board again immediately, following
the same path), the tour is closed; otherwise, it is open.
**/

using std::cin;
using std::cout;

bool issafe(int x, int y, int sol[n][n]) {
    return (x < n && x >= 0 && y < n && y >= 0 && sol[x][y] == -1);
}
bool solve(int x, int y, int mov, int sol[n][n], int xmov[n], int ymov[n]) {
    int k, xnext, ynext;

    if (mov == n * n)
        return true;

    for (k = 0; k < 8; k++) {
        xnext = x + xmov[k];
        ynext = y + ymov[k];

        if (issafe(xnext, ynext, sol)) {
            sol[xnext][ynext] = mov;

            if (solve(xnext, ynext, mov + 1, sol, xmov, ymov) == true)
                return true;
            else
                sol[xnext][ynext] = -1;
        }
    }
    return false;
}
int main() {
    // initialize();

    int sol[n][n];
    int i, j;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++) sol[i][j] = -1;

    int xmov[8] = {2, 1, -1, -2, -2, -1, 1, 2};
    int ymov[8] = {1, 2, 2, 1, -1, -2, -2, -1};
    sol[0][0] = 0;

    bool flag = solve(0, 0, 1, sol, xmov, ymov);
    if (flag == false)
        cout << "solution doesnot exist \n";
    else {
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) cout << sol[i][j] << "  ";
            cout << "\n";
        }
    }
}
